# 第09章 LanguageDriverRegistry语言驱动注册器
# 9.1 引入
MyBatis 从 3.2 开始支持可插拔的脚本语言,因此你可以在插入一种语言的驱动(language driver)之后来写基于这种语言的动态 SQL 查询。
Configuration的构造器如下:
public Configuration() {
// ...类型注册 省略
languageRegistry.setDefaultDriverClass(XMLLanguageDriver.class);
languageRegistry.register(RawLanguageDriver.class);
}
1
2
3
4
5
6
2
3
4
5
6
在 mybatis-config.xml 文件中设置如下:
<typeAliases>
<typeAlias type="org.sample.MyLanguageDriver" alias="myLanguage"/>
</typeAliases>
<settings>
<setting name="defaultScriptingLanguage" value="myLanguage"/>
</settings>
1
2
3
4
5
6
2
3
4
5
6
除了设置默认语言,你也可以针对特殊的语句指定特定语言,这可以通过如下的 lang属性来完成:
<select id="selectBlog" lang="myLanguage">
SELECT * FROM BLOG
</select>
1
2
3
2
3
或者在你正在使用的映射中加上注解 @Lang 来完成:
public interface Mapper {
@Lang(MyLanguageDriver.class)
@Select("SELECT * FROM BLOG")
List<Blog> selectBlog();
}
1
2
3
4
5
2
3
4
5
# 9.2 语言驱动注册器
结构:
内含集合:
private final Map<Class<? extends LanguageDriver>, LanguageDriver> LANGUAGE_DRIVER_MAP = new HashMap<>();
1
key为LanguageDriver的子类的类信息,value为LanguageDriver接口的实现类
默认的类信息:
private Class<? extends LanguageDriver> defaultDriverClass;
1
# 9.2.1 获取语言驱动
public LanguageDriver getDriver(Class<? extends LanguageDriver> cls) {
return LANGUAGE_DRIVER_MAP.get(cls);
}
public LanguageDriver getDefaultDriver() {
return getDriver(getDefaultDriverClass());
}
public Class<? extends LanguageDriver> getDefaultDriverClass() {
return defaultDriverClass;
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 9.2.2 注册语言驱动
// 根据类型注册
public void register(Class<? extends LanguageDriver> cls) {
if (cls == null) {
throw new IllegalArgumentException("null is not a valid Language Driver");
}
if (!LANGUAGE_DRIVER_MAP.containsKey(cls)) {
try {
LANGUAGE_DRIVER_MAP.put(cls, cls.newInstance());
} catch (Exception ex) {
throw new ScriptingException("Failed to load language driver for " + cls.getName(), ex);
}
}
}
// 根据实例注册
public void register(LanguageDriver instance) {
if (instance == null) {
throw new IllegalArgumentException("null is not a valid Language Driver");
}
Class<? extends LanguageDriver> cls = instance.getClass();
if (!LANGUAGE_DRIVER_MAP.containsKey(cls)) {
LANGUAGE_DRIVER_MAP.put(cls, instance);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
注册默认的驱动:
public void setDefaultDriverClass(Class<? extends LanguageDriver> defaultDriverClass) {
register(defaultDriverClass);
this.defaultDriverClass = defaultDriverClass;
}
1
2
3
4
2
3
4
# 9.3 语言驱动
结构:
包括生成参数处理器(ParameterHandler)和sql源(SqlSource)
实现类:


